package Persistencia;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Vector;

import Controlador.Utils;
import Negocio.Cosecha;
import Negocio.ItemMineral;
import Negocio.Lote;
import Negocio.LoteCompuesto;
import Negocio.Propietario;

public class AdmPersistenciaLoteCompuesto extends AdministradorPersistencia {

	private static AdmPersistenciaLoteCompuesto instancia;
	private AdmPersistenciaItemMineral ItemPersistencia;


	public AdmPersistenciaLoteCompuesto() {
		ItemPersistencia = AdmPersistenciaItemMineral.getInstancia();

	}

	public static AdmPersistenciaLoteCompuesto getInstancia() {
		if (instancia == null)
			instancia = new AdmPersistenciaLoteCompuesto();
		return instancia;
	}

	public void borrar(Object o) {
		System.out.println("Entro al delete");
		try {
			LoteCompuesto a = (LoteCompuesto) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("update  Lote set estado = ? where codigo = ?");
			s.setString(1, Utils.CONSTANTE_INACTIVO);
			s.setLong(2, a.getCodigo());
			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

	/** Corregir implementacion */
	public Long insertar(Object o) {
		System.out.println("Entro al insert");
		try {
			LoteCompuesto a = (LoteCompuesto) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("insert into lote values (?,?,?,?,?,?)");
			s.setString(1, Utils.CONSTANTE_LOTE_COMPUESTO);
			s.setLong(2, Utils.CONSTANTE_INT_SIN_USO);
			s.setDouble(3, a.getAreaSiembra());
			s.setString(4, Utils.CONSTANTE_ACTIVO);
			s.setLong(5, a.getProp().getDni());
			s.setLong(6, Utils.CONSTANTE_LONG_SIN_USO);
			s.execute();

			s = con.prepareStatement("select max(codigo) from lote");
			ResultSet result = s.executeQuery();
			Long res = null;
			if (result.next())
				res = result.getLong(1);
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return res;
		} catch (Exception e) {
			System.out.println(e.getMessage());
			return null;
		}
	}

	@Override
	public Vector<Object> buscarTodos() {
		// TODO Hacer Implementacion
		return null;
	}

	/** Corregir implementacion */
	@Override
	public void modificar(Object o) {
		try {
			System.out.println("Entro al update");
			LoteCompuesto a = (LoteCompuesto) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("update  Lote set area = ?, tipo = ? where codigo = ?");
			s.setDouble(2, a.getAreaSiembra());
			s.setString(3, a.getTipo());
			s.setLong(4, a.getCodigo());
			s.execute();

			if (a.getUltimaCoseacha() != null) {
				s = con
						.prepareStatement("insert into cosecha_lote values (?,?)");
				s.setLong(1, a.getUltimaCoseacha().getCodigo());
				s.setLong(1, a.getCodigo());
				s.execute();
			}

			ItemPersistencia.eliminarReferencia(a.getCodigo());
			AdmPersistenciaLote.getInstancia().asignarLoteComponente(
					a.getCodigo(), a.getLotesComponentes());
			System.out.println("Ejecuto");
			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (Exception e) {
			System.out.println();
		}

	}

	@Override
	public Object buscarPorCodigo(Object o) {

		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where tipo = 'c' and codigo = ?");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			LoteCompuesto lote = null;
			if (rta.next()) {

				Collection<ItemMineral> it = ItemPersistencia
						.obtenerPorLote((Long) o);
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}

				Collection<Lote> lotes = AdmPersistenciaLote
						.buscarPorLoteComponente(rta.getLong(1));
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				lote = new LoteCompuesto(rta.getLong(1), pri, rta.getString(2),
						it, lotes, rta.getDouble(4), prop, rta.getString(5));

				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				lote.setUltimaCoseacha(cos);

			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return lote;
		} catch (Exception e) {
			// TODO Exception
			System.out.println("No se pudo obtener el Lote compuesto");
		}
		return null;
	}

	public Vector<LoteCompuesto> buscarPorLoteComponente(long o) {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Lote where tipo = 'c' and loteQueCompone = ? and estado = 's' ");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			Vector<LoteCompuesto> lotes = new Vector<LoteCompuesto>();
			LoteCompuesto l = null;
			while (rta.next()) {

				Collection<ItemMineral> it = AdmPersistenciaItemMineral
						.getInstancia().obtenerPorLote(rta.getLong(1));
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				AdmPersistenciaLote.getInstancia();
				Collection<Lote> lot = AdmPersistenciaLote
						.buscarPorLoteComponente(rta.getLong(1));

				l = new LoteCompuesto(rta.getLong(1), pri, rta.getString(2),
						it, lot, rta.getDouble(4), prop, rta.getString(5));
				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				l.setUltimaCoseacha(cos);
				
				lotes.add(l);
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return lotes;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

	public Vector<Lote> buscarPorLoteSiembra(long o) {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
			.prepareStatement("select * from lote where tipo = 'c' and codigo in (select nroLote from siembra_lote where idsiembra = ?)");
			s.setLong(1, (Long) o);
			ResultSet rta = s.executeQuery();
			Vector<Lote> lotes = new Vector<Lote>();
			LoteCompuesto l = null;
			while (rta.next()) {

				Collection<ItemMineral> it = AdmPersistenciaItemMineral
						.getInstancia().obtenerPorLote(rta.getLong(1));
				ItemMineral pri = null;
				for (ItemMineral i : it) {
					if (Utils.CONSTANTE_PRIMARIO.equals(i.getTipo())) {
						pri = i;
						it.remove(i);
					}
				}
				Propietario prop = (Propietario) AdmPersistenciaPropietario
						.getInstancia().buscarPorCodigo(rta.getLong(6));
				AdmPersistenciaLote.getInstancia();
				Collection<Lote> lot = AdmPersistenciaLote
						.buscarPorLoteComponente(rta.getLong(1));

				l = new LoteCompuesto(rta.getLong(1), pri, rta.getString(2),
						it, lot, rta.getDouble(4), prop, rta.getString(5));
				Cosecha cos = AdmPersistenciaCosecha.getInstancia().buscarUltimaLote(rta.getLong(1));
				l.setUltimaCoseacha(cos);
				
				lotes.add(l);
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);

			return lotes;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}
